package org.demo.es.controller;

import org.demo.es.service.DocumentService;
import org.demo.es.service.ElasticSearchIndexService;
import org.demo.es.service.SearchService;
import org.demo.es.model.common.AjaxResult;
import com.alibaba.fastjson2.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * ElasticSearchController类
 * @author moxiaoli
 */
@RestController
@RequestMapping("/search")
public class ElasticSearchController {

    @Autowired
    private ElasticSearchIndexService elasticSearchService;
    @Autowired
    private DocumentService documentService;
    @Autowired
    private SearchService searchService;

    /**
     * 创建索引
     * @param index 索引名称
     * @return 是否创建成功
     */
    @GetMapping("/addIndex")
    public AjaxResult<Boolean> addIndex(String index){
        return AjaxResult.status(elasticSearchService.createIndex(index));
    }

    /**
     * 删除索引
     * @param index 索引名称
     * @return 是否删除成功
     */
    @GetMapping("/deleteIndex")
    public AjaxResult<Boolean> deleteIndex(String index){
        return AjaxResult.status(elasticSearchService.deleteIndex(index));
    }
    
    /**
     * 判断索引是否存在
     * @param index 索引名称
     * @return 是否存在
     */
    @GetMapping("/isIndexExist")
    public AjaxResult<Boolean> isIndexExist(String index){
        return AjaxResult.status(elasticSearchService.isIndexExist(index));
    }

    /**
     * 获取全部索引
     * @return 索引列表
     */
    @GetMapping("/getAllIndex")
    public AjaxResult<?> getAllIndex(){
        return AjaxResult.data(elasticSearchService.getAllIndex());
    }

    /**
     * 添加文档
     * @param index 索引名称
     * @param data 文档数据 json格式
     * @return 是否添加成功
     */
    @GetMapping("/addDocument")
    public AjaxResult<Boolean> addDocument(String index, String data){
        System.out.println(data);
        JSONObject jsonObject = JSONObject.parseObject(data);
        return AjaxResult.status(documentService.addDocument(index, jsonObject.getString("id"), jsonObject.to(Map.class)));
    }

    /**
     * 删除文档
     * @param index 索引名称
     * @param id 文档id
     * @return 是否删除成功
     */
    @GetMapping("/deleteDocument")
    public AjaxResult<Boolean> deleteDocument(String index, String id){
        return AjaxResult.status(documentService.deleteDocument(index, id));
    }

    /**
     * 更新文档
     * @param index 索引名称
     * @param id 文档id
     * @param data 文档数据 json格式
     * @return 是否更新成功
     */
    @GetMapping("/updateDocument")
    public AjaxResult<?> updateDocument(String index, String id, String data){
        return AjaxResult.data(documentService.updateDocument(index, id, JSONObject.parseObject(data).to(Map.class), Map.class));
    }

    /**
     * 获取文档
     * @param index 索引名称
     * @param id 文档id
     * @return 文档数据
     */
    @GetMapping("/getDocument")
    public AjaxResult<?> getDocument(String index, String id){
        return AjaxResult.data(documentService.getDocument(index, id, Map.class));
    }

    /**
     * 查询
     * @param index 索引名称
     * @param query 查询语句
     * @return 查询结果
     */
    @GetMapping("/search")
    public AjaxResult<?> search(String index, String query){
        return AjaxResult.data("查询结果",searchService.searchDocument(index, query, Map.class));
    }

    /**
     * 查询所有文档
     * @return 查询结果
     */
    @GetMapping("/getAllDocument")
    public AjaxResult<?> getAllDocument(){
        return AjaxResult.data("查询结果",elasticSearchService.getAllDocument());
    }


}
